package com.swing;

public class Main {
    public static void main(String[] args) {
        // 创建游戏窗口，标题为"MyFirstWindow"，尺寸为800x600像素
        GameWindow window = new GameWindow("MyFirstWindow", 800, 600);
        // 显示游戏窗口
        window.show();

        // 记录上一帧的时间戳（毫秒），用于计算时间差
        long lastTime = System.currentTimeMillis();
        // 时间累加器，用于累计未处理的时间（固定步长逻辑的核心）
        long accTime = 0;
        // 当前帧的时间戳
        long currentTime;
        // 固定时间步长（毫秒），1000/60≈16ms，即每秒更新60次逻辑
        long deltaTime = 1000 / 60;

        // 游戏运行状态标记
        boolean running = true;
        // 游戏主循环：持续处理逻辑更新和画面渲染
        while (running) {
            // 获取当前系统时间（毫秒）
            currentTime = System.currentTimeMillis();
            // 累加从上一帧到当前帧的时间差（未处理的时间）
            accTime += currentTime - lastTime;
            // 更新上一帧时间戳，为下一循环做准备
            lastTime = currentTime;

            // 包一层
            if (accTime >= deltaTime) {
                // 固定步长更新逻辑：当累计时间 >= 固定步长时，执行逻辑更新
                // 确保无论帧率如何波动，逻辑更新间隔始终是deltaTime
                while (accTime >= deltaTime) {
                    // 从累计时间中减去一个固定步长
                    accTime -= deltaTime;
                    // 调用窗口更新方法，传入以秒为单位的固定步长（deltaTime/1000）
                    // 确保游戏逻辑（如移动、物理）基于稳定的时间间隔计算
                    window.update(deltaTime / 1000.f);
                }
                // 渲染当前帧画面：根据最新的游戏状态绘制图像
                // 即使逻辑未更新（accTime不足deltaTime），也会刷新画面保持流畅
                window.render();
            }
        }
    }
}
